发票识别准确率 99%+ 的秘密,都在这了

大家好,我是正在实战各种 AI 项目的程序员晚枫。


📈 从 95% 到 99%,我做了这些

官方数据:准确率 98%+。

我实测:95% 左右。

3 个月优化:稳定在 99.5%。

今天:公开所有优化技巧。


秘密 1:图片质量是关键(贡献 40%)

最佳实践

  • PDF 电子票 > 扫描件 > 拍照件
  • 分辨率 ≥ 300 DPI
  • 亮度适中(80-200)
  • 清晰度 ≥ 100(Laplacian 方差)

代码

1
2
3
4
5
6
7
8
def check_quality(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

brightness = np.mean(gray)
sharpness = cv2.Laplacian(gray, cv2.CV_64F).var()

return (80 < brightness < 200) and (sharpness > 100)

秘密 2:图片预处理(贡献 20%)

处理步骤

  1. 灰度化
  2. 去噪
  3. 增强对比度
  4. 二值化(可选)

代码

1
2
3
4
5
6
7
def preprocess(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
denoised = cv2.fastNlMeansDenoising(gray, None, 30, 7, 21)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
enhanced = clahe.apply(denoised)
cv2.imwrite('processed.jpg', enhanced)

秘密 3:分批处理(贡献 15%)

原因:避免网络超时,避免 API 限流。

做法

1
2
3
4
5
# 每批 50 张
for i in range(0, total, 50):
batch = files[i:i+50]
process_batch(batch)
time.sleep(2) # 批次间休息

秘密 4:重试机制(贡献 10%)

代码

1
2
3
4
5
6
7
8
9
def recognize_with_retry(file_path, max_retries=3):
for i in range(max_retries):
try:
return recognize(file_path)
except:
if i < max_retries - 1:
time.sleep(5)
else:
raise

秘密 5:后处理校验(贡献 10%)

校验规则

  • 发票代码:10 或 12 位数字
  • 发票号码:8 位数字
  • 金额:正数
  • 日期:有效日期

代码

1
2
3
4
5
6
7
8
def validate(data):
if not re.match(r'^\d{10}|\d{12}$', data['发票代码']):
return False
if not re.match(r'^\d{8}$', data['发票号码']):
return False
if float(data['金额']) <= 0:
return False
return True

秘密 6:异常发票库(贡献 5%)

做法

  • 记录识别失败的发票
  • 分析失败原因
  • 针对性优化

效果:持续改进,越用越准。


📊 优化效果

优化项提升累计
基础准确率-95%
图片质量控制+2%97%
图片预处理+1%98%
分批处理+0.5%98.5%
重试机制+0.5%99%
后处理校验+0.3%99.3%
异常发票库+0.2%99.5%

💬 联系我

平台账号/链接
微信扫码加好友
微博@程序员晚枫
知乎@程序员晚枫
抖音@程序员晚枫
小红书@程序员晚枫
B 站Python 自动化办公社区

主营业务:AI 编程培训、企业内训、技术咨询


🎓 推荐课程


99% 的准确率,不是魔法,是细节。

每个 0.1% 的提升,都是优化出来的。

这些秘密,现在你也有了。

去实践吧!💪

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!